


/**
 * 为数组添加7个响应式的方法
 * @param {*} arr 
 */

// 数组默认的原型对象
const arrayProto = Array.prototype
// 以默认对象为原型创建一个新对象
const arrayMethods = Object.create(arrayProto)

// 数组7个方法定义
// ps: 因为这7个方法会改变数组本身，cancat、slice以及其他的返回新的数组，是不会改动自身的
const methodsToPatch = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse']
// 遍历重写
methodsToPatch.forEach(method => {
  Object.defineProperty(arrayMethods, method, {
    value: function(...args) {
      // 先完成原先的工作
      const ret = arrayProto[method].apply(this, args)
      // 进行响应式处理
      console.log('start reactive!!')
      // 新的元素列表
      let inserted = []
      switch(method) {
        case 'push':
          break
        case 'unshift':
          inserted = args
          break
        case 'splice':
          inserted = args.slice(2)
          break
      }
      // 如果有新增的元素，则对新的进行响应式
      inserted.length && this.__ob__.observeArray(inserted)
      // 通知以来更新
      this.__ob__.dep.notify()
      return ret
    },
    configurable: true,
    writable: true,
    enumerable: true
  })
})
export function protoArgument(arr) {
  arr.__proto__ = arrayMethods
}